/*
 * @Author: intellectual-seeker 3336339701@qq.com
 * @Date: 2025-08-28 16:37:45
 * @LastEditors: intellectual-seeker 3336339701@qq.com
 * @LastEditTime: 2025-08-31 13:52:21
 * @FilePath: /code/lesson31/testPthread.cc
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
#include <iostream>
using namespace std;
#include <pthread.h>
#include <unistd.h>
#include <string>
#include <vector>
#include <ctime>
#include <cstdlib>
#include "Thread.hpp"
using namespace ThreadModule;
#include <vector>

//多执行流访问未保护资源的数据不一致问题
//场景模拟：抢票

int g_tickets = 10000;

const int num = 5;

void BuyTicket(int& g_tickets)
{
    while(true)
    {
        if(g_tickets > 0)
        {
            usleep(1000);//1ms
            printf("get ticket %d\n", g_tickets);
            g_tickets--;
            //cout << "buy ticket, rest of ticket : " << g_tickets << endl;
        }
        else
        {
            break;
        }
    }
}

int main()
{
    vector<Thread<int>> tds;
    for(int i = 0; i < num; i++)
    {
        string name = "Thread-" + to_string(i + 1);
        //tds.emplace_back(Thread<int>(BuyTicket, g_tickets, name));
        tds.emplace_back(BuyTicket, g_tickets, name);//可变模板参数包，可直接传对象构造函数的参数
    }

    //for(auto e : tds)//范围for迭代时，只是原变量的一份临时拷贝
    for(auto& e : tds)//为什么要引用
    {
        e.start();
    }

    for(auto& e : tds)
    {
        e.join();
    }

    return 0;
}

//简单模拟实现C++中的线程类
// void Print(int num)
// {
//     int cnt = 5;
//     while(cnt--)
//     {
//         cout << "num is : " << num << endl;
//         sleep(1);
//     }
// }

// int main()
// {
//     Thread<int> td(Print, 10);
//     td.start();

//     td.join();

//     return 0;
// }

//线程函数的使用与理解
// class Task//加法任务
// {
// public:
//     Task(int x, int y)
//         :_datax(x), _datay(y)
//     {}

//     ~Task()
//     {}

//     int Execute()//执行
//     {
//         return _datax + _datay;
//     }

// private:
//     int _datax;
//     int _datay;
// };

// class ThreadData
// {
// public:
//     ThreadData(int x, int y, const char* name)
//         :_name(name),_t(x, y)//初始化列表构造
//     {}

//     ~ThreadData()
//     {}

//     const string name()
//     {
//         return _name;
//     }

//     int run()
//     {
//         return _t.Execute();
//     }

// private:
//     string _name;
//     Task _t;
// };

// class Result
// {
// public:
//     Result(){}
//     ~Result(){}

//     void setData(string name, int ret)
//     {
//         _name = name;
//         _ret = ret;
//     } 

//     void Print()
//     {
//         //cout << "pthread name is : " << _name << ' ';
//         //cout << "ret value is : " << _ret << endl;
//         cout << "pthread name is : " << _name 
//         << ", ret val is : " << _ret << endl;
//     }

// private:
//     string _name;
//     int _ret;
// };

// void* handlerTask(void* arg)
// {
//     //ThreadData data = reinterpret_cast<ThreadData>(arg);
//     ThreadData* data = static_cast<ThreadData*>(arg);

//     //int ret = data.run();
//     int ret = data->run();

//     //Result result;
//     //result.setData(data.name(), ret);
//     Result* result = new Result();
//     result->setData(data->name(), ret);

//     cout << "this is a new thread " << data->name() << endl;

//     delete data;

//     return (void*)result;
// }

// const int thread_num = 5;

// int main()
// {
//     srand((size_t)time(nullptr));

//     //创建
//     vector<pthread_t> tids;
//     for(int i = 0; i < thread_num; i++)
//     {
//         pthread_t tid;
        
//         int x = rand() % 10;
//         int y = rand() % 10;
//         char name[64];
//         snprintf(name, sizeof(name), "pthread-%d", i);
//         //ThreadData td(x, y, name);
//         //pthread_create(&tid, nullptr, handlerTask, (void*)td);

//         ThreadData* td = new ThreadData(x, y, name);
//         pthread_create(&tid, nullptr, handlerTask, (void*)td);
//         tids.push_back(tid);
//         cout << "create done..." << endl;
//         sleep(1);
//     }

//     //等待
//     vector<Result*> results;
//     for(auto tid : tids)
//     {
//         //Result result;
//         //pthread_join(tid, (void**)&result);

//         Result* result;
//         int n = pthread_join(tid, (void**)&result);//输出型参数，要传入接收返回值的变量地址
//         if(n == 0)
//             cout << "join success..." << endl;
        
//         results.push_back(result);
//     }

//     //打印返回信息
//     //for(auto& result : results)
//     for(auto result : results)
//     {
//         result->Print();
//         sleep(1);

//         delete result;
//     }

//     return 0;
// }

//线程的局部存储
//__thread int g_val = 10;
// __thread int create_time = 0;

// void* newthreadrun(void* arg)
// {
//     create_time = time(nullptr);
//     while(true)
//     {
//         //cout << "new thread, g_val : " << g_val++ << endl;
//         cout << "new thread create time : " << create_time << endl;
//         sleep(1);
//     }
// }

// int main()
// {
//     for(int i = 0; i < 5; i++)
//     {
//         pthread_t tid;
//         pthread_create(&tid, nullptr, newthreadrun, nullptr);
//         sleep(1);
//     }

//     while(true)
//     {
//         //cout << "main thread, g_val : " << g_val << endl;
//         sleep(1);
//     }

//     return 0;
// }

//线程detach
//无法观察其资源自动销毁
// void* newthreadrun(void* arg)
// {
//     pthread_detach(pthread_self());
//     cout << "this is a new detach thread" << endl;
//     int cnt = 10;
//     while(cnt--)
//     {
//         sleep(1);
//     }

//     cout << "new thread quit..." << endl;

//     return nullptr;
// }

// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid, nullptr, newthreadrun, nullptr);

//     while(true)
//     {
//         sleep(1);
//     }

//     return 0;
// }

//线程等待与退出码
// void* newthreadrun(void* arg)
// {
//     return (void*)1;
// }

// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid, nullptr, newthreadrun, nullptr);

//     int ret_val;
//     pthread_join(tid, (void**)&ret_val);

//     cout << "new thread ret val : " << ret_val << endl;

//     return 0;
// }

//新线程的传参
// void* newthreadrun(void* arg)
// {
//     //const char* name = (char*)arg;
//     const char* name = static_cast<char*>(arg);
//     int cnt = 5;
//     //while(cnt--)
//     while(true)
//     {
//         cout << "this is " << name << endl;//打印地址
//         sleep(1);
//     }

//     //pthread_cancel(pthread_self());
// }

// int main()
// {
//     vector<pthread_t> tids;
//     for(int i = 1; i <= 5; i++)
//     {
//         pthread_t tid;
//         //char name[64] = { 0 };
//         char* name = new char[64]{0};
//         snprintf(name, 64 * sizeof(char), "pthread-%d", i);
//         pthread_create(&tid, nullptr, newthreadrun, name);

//         tids.push_back(tid);

//         sleep(1);
//     }

//     sleep(3);

//     for(auto tid : tids)
//     {
//         pthread_cancel(tid);
//         cout << "cancel thread " << tid << " success..." << endl;
//         sleep(1);
//     }

//     while(true)
//     {
//         sleep(1);
//     }

//     return 0;
// }

//观察线程pid与pthread_id
// string ToHex(int tid)
// {
//     char ret[64];
//     snprintf(ret, sizeof(ret), "0x%x", tid);

//     return ret;
// }

// void* newthreadrun(void* args)
// {
//     while(true)
//     {
//         cout << "this is a new thread, pid is : " << getpid() << ", tid is :" << ToHex(pthread_self()) << endl;
//         sleep(1);
//     }
// }

// int main()
// {
//     pthread_t tid;
//     int n = pthread_create(&tid, nullptr, newthreadrun, nullptr);

//     while(true)
//     {
//         cout << "this is main thread, pid is : " << getpid() << ", tid is : " << ToHex(tid) << endl;
//         sleep(1);
//     }

//     return 0;
// }